package com.starryx.blog.web.admin;

import com.starryx.blog.po.Type;
import com.starryx.blog.service.TypeService;
import com.starryx.blog.vo.Page;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.Valid;

@Controller
@RequestMapping("/admin")
public class TypeController {

    @Autowired
    private TypeService typeService;

    // 跳转到分类列表并查询
    @GetMapping("/types")
    public String types(
            // 设置分页对象的默认参数，分页为 10 项，根据 id 进行排序，降序
            Integer page,
            Model model){
        if(page == null){
            model.addAttribute("page", typeService.listType(new Page(1, 3, "id desc")));
        }else{
            model.addAttribute("page", typeService.listType(new Page(page, 3, "id desc")));

        }

        return "admin/types";
    }

    // 跳转到新增页面
    @GetMapping("/types/input")
    public String input(Model model){
        model.addAttribute("type", new Type());     // 用于实现后端校验功能，联系前端一起理解，如果不传值就会发生空指针异常
        return "admin/types-input";
    }

    // 跳转到修改分类页面
    @GetMapping("types/{id}/input")
    public String editInput(@PathVariable Long id, Model model){
        model.addAttribute("type", typeService.getType(id));
        return "admin/types-input";
    }

    // 新增分类
    @PostMapping("/types")
    public String post(@Valid Type type,        // @Valid : 代表要校验 type 对象
                       BindingResult result,    // 接受校验之后的结果，BindingResult 一定要和前端传来的实体类挨在一起，要不然没有校验效果（不是调用校验的方法了）
                       RedirectAttributes attributes){
        Type type1 = typeService.getTypeByName(type.getName());
        if(type1 != null){
            // 第二种后端校验
            //             要校验的属性与实体类的属性对应，自定义的错误码（字符串），传到前端的描述信息
            result.rejectValue("name", "nameError", "不能添加重复的分类");
        }
        if(result.hasErrors()){     // 第一种后端校验 和 第二种后端校验
            return "admin/types-input";
        }
        int t = typeService.saveType(type);
        if(t == 0){
            // 保存失败
            attributes.addFlashAttribute("message", "新增失败");
        }else{
            // 保存成功
            attributes.addFlashAttribute("message", "新增成功");
        }
        // 不要直接返回页面，重定向后会进行一次查询，数据就会更新
        return "redirect:/admin/types";
    }

    // 修改分类
    @PostMapping("/types/{id}")
    public String post(@Valid Type type,        // @Valid : 代表要校验 type 对象
                       BindingResult result,    // 接受校验之后的结果
                       @PathVariable Long id,
                       RedirectAttributes attributes){
        Type type1 = typeService.getTypeByName(type.getName());
        if(type1 != null){
            // 第二种后端校验
            //             要校验的属性与实体类的属性对应，自定义的错误码（字符串），传到前端的描述信息
            result.rejectValue("name", "nameError", "不能添加重复的分类");
        }
        if(result.hasErrors()){     // 第一种后端校验
            return "admin/types-input";
        }
        int t = typeService.updateType(id, type);
        if(t == 0){
            // 保存失败
            attributes.addFlashAttribute("message", "更新失败");
        }else{
            // 保存成功
            attributes.addFlashAttribute("message", "更新成功");
        }
        // 不要直接返回页面，重定向后会进行一次查询，数据就会更新
        return "redirect:/admin/types";
    }

    // 删除分类
    @GetMapping("/types/{id}/delete")
    public String delete(@PathVariable Long id,
                         RedirectAttributes attributes){
        typeService.deleteType(id);
        attributes.addFlashAttribute("message", "删除成功");
        return "redirect:/admin/types";
    }
}
